/**
 * @file VersionnageALaGNU.h
 * @author Pierre Le Bodic
 * @date mardi 13 décembre
 */

#include <vector>
#include <string>
#include <sstream>
#include <boost/regex.hpp>
#include "SystemeDeVersionnage.h"

#ifndef _VERSIONNAGE_A_LA_GNU_H_
#define _VERSIONNAGE_A_LA_GNU_H_

namespace gestionnaireDeVersions {

	/**
	 * Cette classe modélise le versionnage à la manière de ce que fait GNU,
	 * c'est à dire majeur.mineur.revision (ex 1.11.5). Elle implémente le
	 * "design pattern" singleton.
	 */
	class VersionnageALaGNU : public SystemeDeVersionnage{
	   private:
		  ///L'unique instance
		  static VersionnageALaGNU instance;
		  /**
		   * Expression régulière correspondant à une notation
		   * majeur.mineur.revision, où majeur, mineur et revision sont des
		   * nombres entiers positifis.
		   */
		  boost::regex expressionALaGNU;
		  
		  /**
		   * Constructeur privé
		   */
		  VersionnageALaGNU();
		  
		  /**
		   * Constructeur par copie privé (à ne pas implémenter)
		   */
		  VersionnageALaGNU(VersionnageALaGNU const&);
		  
		  /**
		   * Constructeur par affectation privé (à ne pas implémenter)
		   */
		  void operator=(VersionnageALaGNU const&);
	   
	   public:
		  
		  /**
		   * Méthode qui crée si besoin et retourne l'instance singleton.
		   */
		  static SystemeDeVersionnage& getInstance();
		  //Via SystemeDeVersionnage
		  virtual bool estValide(const string version) const;
		  //Via SystemeDeVersionnage
		  virtual int compare(const string s1, const string s2) const throw(ExceptionDeVersion);
	};

}//namespace


#endif // _VERSIONNAGE_A_LA_GNU_H_
